package com.wang.lotterysystem.service.manager.operator;

import com.wang.lotterysystem.dao.dataobject.activity.ActivityUserDO;
import com.wang.lotterysystem.dao.mapper.ActivityUserMapper;
import com.wang.lotterysystem.service.dto.activity.ActivityStatusConvertDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 转换人员状态
 */
@Component
public class UserOperator extends AbstractActivityOperator{

    @Autowired
    private ActivityUserMapper activityUserMapper;

    /**
     * 人员状态扭转的执行次序 --> 1
     */
    @Override
    public Integer sequence() {
        return 1;
    }

    /**
     * 判断是否需要进行状态转换
     * @param statusConvertDTO 状态转换参数
     * @return true-->需要 / false-->不需要
     */
    @Override
    public Boolean needConvert(ActivityStatusConvertDTO statusConvertDTO) {
        //如果传入的参数中: 关联人员id列表为空 或 活动id为空 --> 返回false
        if (statusConvertDTO.getUserIds() == null ||
                statusConvertDTO.getUserIds().isEmpty() ||
                statusConvertDTO.getActivityId() == null){
            return false;
        }


        Long activityId = statusConvertDTO.getActivityId();

        //根据id从库中查询出活动关联人员的信息
        for (Long userId :statusConvertDTO.getUserIds()) {
            ActivityUserDO activityUserDO = activityUserMapper.selectUserById(userId,activityId);

            if (activityUserDO == null){
                //如果没有查询到对应的人员信息 --> 返回false
                return false;
            }
            if (activityUserDO.getStatus().equals(statusConvertDTO.getUserTargetStatus().name())){
                //检查人员状态是否和传入参数中的状态(completed)一致
                //如果一致 --> 不进行扭转,返回false
                return false;
            }
        }
        return true;
    }

    /**
     * 扭转状态
     * @param statusConvertDTO 状态扭转参数
     * @return 是否扭转成功
     */
    @Override
    public Boolean convertStatus(ActivityStatusConvertDTO statusConvertDTO) {
        //拿到活动id
        Long activityId = statusConvertDTO.getActivityId();

        //调用mapper层的batchUpdateStatus()方法进行状态扭转
        for (Long userId : statusConvertDTO.getUserIds()) {
            activityUserMapper.batchUpdateStatus(
                    statusConvertDTO.getUserTargetStatus().name(),
                    activityId,
                    userId
            );
        }

        //返回扭转成功
        return true;
    }
}